package com.qingcheng.controller;

import com.alibaba.dubbo.config.annotation.Reference;
import com.alibaba.fastjson.JSON;
import com.alibaba.fastjson.JSONObject;
import com.alibaba.fastjson.serializer.SerializerFeature;
import com.qingcheng.pojo.goods.Goods;
import com.qingcheng.pojo.goods.Sku;
import com.qingcheng.pojo.goods.Spu;
import com.qingcheng.service.goods.CategoryService;
import com.qingcheng.service.goods.SpuService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.thymeleaf.TemplateEngine;
import org.thymeleaf.context.Context;

import java.io.File;
import java.io.FileNotFoundException;
import java.io.PrintWriter;
import java.io.UnsupportedEncodingException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

/**
 * 生成商品详情页
 * @author 岳剑飞
 * @Company http://www.ithiema.com
 */
@RestController
@RequestMapping("/item")
public class ItemController {

    @Reference
    private SpuService spuService;

    @Autowired
    private TemplateEngine templateEngine;  //模板引擎

    @Value("${pagePath}")
    private String pagePath;

    @Reference
    private CategoryService categoryService;

    /**
     * 生成商品详情页
     *
     * @param id
     */
    @GetMapping("/createPage")
    public void createPage(String id) {

        //1.查询商品信息
        Goods goods = spuService.findGoodsById(id);  //包含spu信息 和其 对应着的所有sku信息
        //获取到SPU 信息
        Spu spu = goods.getSpu();
        //获取sku列表
        List<Sku> skuList = goods.getSkuList();


        //查询商品分类
        List<String> categoryList = new ArrayList<String>();
        categoryList.add(categoryService.findById(spu.getCategory1Id()).getName()); //一级分类
        categoryList.add(categoryService.findById(spu.getCategory2Id()).getName()); //二级分类
        categoryList.add(categoryService.findById(spu.getCategory3Id()).getName()); //三级分类

        //生成SKU地址列表
        Map<String, String> urlMap = new HashMap<>();
        //循环sku列表
        for (Sku sku : skuList) {
            if ("1".equals(sku.getStatus())) {
                //对规格json字符串进行排序
                //为了能够保证规格JSON字符串能够在查询的时候匹配，需要使用SerializerFeature.SortField.MapSortField进行排序
                String specJson = JSON.toJSONString(JSON.parseObject(sku.getSpec()), SerializerFeature.MapSortField);
                //生成SKU地址的列表，以规格JSON字符串作为KEY，商品详细页的地址(id)作为值
                //{"{'颜色': '黑色', '版本': '6GB+64GB'}": "100000047372"};
                urlMap.put(specJson, sku.getId() + ".html");
            }
        }


        //2. 批量生成sku页面(每个SKU为一个页面)
        for (Sku sku : skuList) {
            //1. 创建上下文
            Context context = new Context();
            //创建数据模型
            Map<String, Object> dataModel = new HashMap();

            //将spu sku 封装到 数据模型中
            dataModel.put("sku", sku);
            dataModel.put("spu", spu);

            //将三级分类放入到数据模型中
            dataModel.put("categoryList", categoryList);  //商品分类面包屑

            // 为模型数据 添加SKU图片列表，和SPU图片列表
            dataModel.put("skuImages", sku.getImages().split(","));  //SKU图片列表
            dataModel.put("spuImages", spu.getImages().split(","));  //SPU图片列表

            //为数据模型 dataModel 添加规格参数
            JSONObject parseItems = JSON.parseObject(spu.getParaItems());  //SPU参数列表parse
            dataModel.put("paraItems", parseItems);
            JSONObject specItems = JSON.parseObject(sku.getSpec());//当前SKU规格 spec
            dataModel.put("specItems", specItems);

            //规格选择面板
            // 原集合  {"颜色":["红色","黑色"],"版本":["8GB+128GB","6GB+64GB"]}
            Map<String, List> specMap = (Map) JSON.parse(spu.getSpecItems());

            for (String key : specMap.keySet()) {     //循环规格名称
                List<String> list = specMap.get(key); //["红色","黑色"]
                //创建新的集合 [{ 'option':'红色',checked:true },{ 'option':'黑色',checked:false }]
                List<Map> mapList = new ArrayList<Map>();

                //循环规格选项值
                for (String value : list) {
                    Map map = new HashMap();
                    map.put("option", value); //规格选项。
                    if (specItems.get(key).equals(value)) {  //是否和当前sku的规格相同
                        map.put("checked", true);  //是否选中

                    } else {
                        map.put("checked", false);  //是否选中
                    }

                    //商品详情页地址  （添加以下代码）
                    Map<String, String> spec = (Map) JSON.parseObject(sku.getSpec()); //当前的sku 规格{'颜色': '黑色', '版本': '6GB+64GB'}
                    spec.put(key, value);
                    String specJson = JSON.toJSONString(spec, SerializerFeature.MapSortField);
                    map.put("url", urlMap.get(specJson));
                    mapList.add(map);
                }

                specMap.put(key, mapList);// 用新集合覆盖原集合

            }
            dataModel.put("specMap", specMap);  //规格面板

            context.setVariables(dataModel);

            //2. 准备文件
            File dir = new File(pagePath);
            if (!dir.exists()) {
                //如果文件路径不存在，就创建它
                dir.mkdirs();
            }

            //根据sku的id生成页面的全路径
            File dest = new File(dir, sku.getId() + ".html");

            //3. 生成页面
            PrintWriter writer = null;
            try {
                writer = new PrintWriter(dest, "utf-8");
                templateEngine.process("item", context, writer);
            } catch (FileNotFoundException e) {
                e.printStackTrace();
            } catch (UnsupportedEncodingException e) {
                e.printStackTrace();
            }

        }

    }

}
